package com.youbo.common.utils;


import org.apache.commons.codec.digest.DigestUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 工具类
 * @author Macy
 * @email 420534221@qq.com
 * @date 2018年5月3日
 */
public class Tools {



    /**
     * <将obj转换为string，如果obj为null则返回defaultVal>
     *
     * @param obj 需要转换为string的对象
     * @param defaultVal 默认值
     * @return obj转换为string
     */
    public static String toString(Object obj, String defaultVal){
        return (obj != null) ? obj.toString() : defaultVal;
    }
    /**
     * <将obj转换为string，默认为空>
     *
     * @param obj 需要转换为string的对象
     * @return 将对象转换为string的字符串
     */
    public static String toString(Object obj){
        return toString(obj, "");
    }

    /**
     * <将对象转换为int>
     *
     * @param obj 需要转换为int的对象
     * @param defaultVal 默认值
     * @return obj转换成的int值
     */
    public static Integer toInt(Object obj, Integer defaultVal) {
        try
        {
            return (obj != null) ? Integer.parseInt(toString(obj, "0")) : defaultVal;
        }catch(Exception e)
        {
        }
        return defaultVal;
    }

    /**
     * <将对象转换为int>
     *
     * @param obj 需要转换为int的对象
     * @return obj转换成的int值
     */
    public static Integer toInt(Object obj)
    {
        return toInt(obj, 0);
    }

    /**
     * <将对象转换为Integer>
     *
     * @param obj 需要转换为Integer的对象
     * @return obj转换成的Integer值
     */
    public static Integer toInteger(Object obj)
    {
        return toInt(obj, null);
    }

    /**
     * <将对象转换为int>
     *
     * @param obj 需要转换为int的对象
     * @param defaultVal 默认值
     * @return obj转换成的int值
     */
    public static Float toFloat(Object obj, float defaultVal)
    {
        return (obj != null) ? Float.parseFloat(toString(obj, "0")) : defaultVal;
    }

    /**
     * <将对象转换为Float>
     *
     * @param obj 需要转换为Float的对象
     * @return obj转换成的Float值
     */
    public static Float toFloat(Object obj)
    {
        return toFloat(obj, 0);
    }

    /**
     * <将obj转换为long>
     *
     * @param obj 需要转换的对象
     * @param defaultVal 默认值
     * @return 如果obj为空则返回默认，不为空则返回转换后的long结果
     */
    public static Long toLong(Object obj, long defaultVal)
    {
        return (obj != null) ? Long.parseLong(toString(obj)) : defaultVal;
    }

    /**
     * <将obj转换为long>
     *
     * @param obj 需要转换的对象
     * @return 如果obj为空则返回默认的0l，不为空则返回转换后的long结果
     */
    public static Long toLong(Object obj)
    {
        return toLong(obj, 0l);
    }

    /**
     * 将object转换为double类型，如果出错则返回 defaultVal
     * @param obj 需要转换的对象
     * @param defaultVal 默认值
     * @return 转换后的结果
     */
    public static Double toDouble(Object obj,Double defaultVal)
    {
        try
        {
            return Double.parseDouble(obj.toString());
        }
        catch(Exception e)
        {
            return defaultVal;
        }
    }

    /**
     * 将object转换为double类型，如果出错则返回 0d
     * @param obj 需要转换的对象
     * @return 转换后的结果
     */
    public static double toDouble(Object obj)
    {
        return toDouble(obj,0d);
    }

    /**
     * <将List<Object>转换为List<Map<String, Object>>>
     *
     * @param list 需要转换的list
     * @return 转换的结果
     */
    @SuppressWarnings("unchecked")
    public static List<Map<String, Object>> converterForMapList(List<Object> list)
    {
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        for (Object tempObj : list)
        {
            result.add((HashMap<String, Object>)tempObj);
        }
        return result;
    }



    /**
     * 格式化日期
     * @param date
     * @param format
     * @return
     */
    public static String format(String date,String format)
    {
        SimpleDateFormat format0 = new SimpleDateFormat(format);
        return format0.format(date);
    }


    /**
     * 生成订单号
     * @return
     */
    public static String getOrderIdByUUId() {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String newDate=sdf.format(new Date());
        String result="";
        result+=(int)(1+Math.random()*(999999-100000+1));//6位随机数
        return (newDate+result);//23位订单号
    }
    /**
     * 生成充值订单号
     * @return
     */
    public static String getOrderIdByUUIdCZ() {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String newDate=sdf.format(new Date());
        String result="";
        result+=(int)(1+Math.random()*(9999999-1000000+1));//6位随机数
        return (newDate+result);//23位订单号
    }

    /**
     * 生成订单号
     * @return
     */
    public static String getOrderIdByUUId2() {
        String uuid="";
        int machineId = 1;// 最大支持1-9个集群机器部署
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if (hashCodeV < 0) {// 有可能是负数
            hashCodeV = -hashCodeV;
        }
        uuid=machineId + String.format("%015d", hashCodeV);

        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
        String newDate=sdf.format(new Date());
        String result="";
        Random random=new Random();
        for(int i=0;i<2;i++){
            result+=random.nextInt(10);
        }
        return newDate+result+uuid;
    }

    /**
     * md5加密
     * @param str 加密内容
     * @return
     */
    public static String md5(String str){
        try{
            //确定计算方法
//            /MessageDigest md5=MessageDigest.getInstance("MD5");
            String encodeStr=DigestUtils.md5Hex(str);
            return encodeStr;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取随机数
     * @param str 几位
     * @return
     */
    public static String random (int str){
        String result="";
        try{
            Random random = new Random();
            for (int i=0;i<str;i++)
            {
                result+=random.nextInt(10);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    public static Map getParameterMap(HttpServletRequest request) {
        // 参数Map
        Map properties = request.getParameterMap();
        // 返回值Map
        Map returnMap = new HashMap();
        Iterator entries = properties.entrySet().iterator();
        Map.Entry entry;
        String name = "";
        String value = "";
        while (entries.hasNext()) {
            entry = (Map.Entry) entries.next();
            name = (String) entry.getKey();
            Object valueObj = entry.getValue();
            if(null == valueObj){
                value = "";
            }else if(valueObj instanceof String[]){
                String[] values = (String[])valueObj;
                for(int i=0;i<values.length;i++){
                    value = values[i] + ",";
                }
                value = value.substring(0, value.length()-1);
            }else{
                value = valueObj.toString();
            }
            returnMap.put(name, value);
        }
        return returnMap;
    }



    /**
     *
     * @param arta
     */
    public static void main(String[] arta)throws  Exception{
        System.out.println(genHMAC("22222222","1111111"));
    }

    /**
     *HMACSHA1 data
     *Base64
     * @param data 原文
     * @param key   密匙
     * @return   加密后的字符串
     */

    public static String genHMAC(String data, String key) {
        byte[] result = null;
        try {
            SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signinKey);
            byte[] rawHmac = mac.doFinal(data.getBytes());
            result = Base64.getEncoder().encode(rawHmac);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != result) {
            return new String(result);
        } else {
            return null;
        }
    }



}
